package com.pkk.cloud.support.gateway.auth;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @description: 签名认证
 * @author: peikunkun
 * @create: 2019-05-29 15:33
 **/
@Slf4j
@Component
public class AuthSignFilter extends ZuulFilter {

  /**
   * pre：可以在请求被路由之前调用 route：在路由请求时候被调用 post：在route和error过滤器之后被调用 error：处理请求时发生错误时被调用
   */
  @Override
  public String filterType() {
    return "pre";
  }

  /**
   * 通过int值来定义过滤器的执行顺序,越小级别越高
   *
   * @return
   */
  @Override
  public int filterOrder() {
    return 0;
  }

  /**
   * 返回一个boolean类型来判断该过滤器是否要执行，所以通过此函数可实现过滤器的开关。在上例中，我们直接返回true，所以该过滤器总是生效
   *
   * @return
   */
  @Override
  public boolean shouldFilter() {
    return true;
  }

  /**
   * 过滤器的具体逻辑。需要注意，这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求，不对其进行路由，然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码
   *
   * @return
   */
  @Override
  public Object run() throws ZuulException {
    RequestContext context = RequestContext.getCurrentContext();
    HttpServletRequest request = context.getRequest();
    log.debug("路由:时间:" + System.currentTimeMillis() + "sessionId:" + request.getSession().getId() + ",请求参数:" + request.getQueryString());
    return null;
  }
}
